Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] Add databricks_function resource #4189

Open
wants to merge 8 commits into
base: main
Choose a base branch
from

Conversation

dgomez04
Copy link
Contributor

@dgomez04 dgomez04 commented Nov 2, 2024

Changes

Introduces databricks_function resource—allowing users to create and manage UDFs within Terraform. work in progress...

Closes #4074

Tests

  • make test run locally
  • relevant change in docs/ folder
  • covered with integration tests in internal/acceptance
  • relevant acceptance tests are passing
  • using Go SDK

@dgomez04 dgomez04 requested review from a team as code owners November 2, 2024 02:35
@dgomez04 dgomez04 requested review from hectorcast-db and removed request for a team November 2, 2024 02:35
@dgomez04 dgomez04 changed the title [FEATURE] Add databricks_function resource [FEATURE] WIP Add databricks_function resource Nov 2, 2024
@dgomez04 dgomez04 changed the title [FEATURE] WIP Add databricks_function resource [Feature] [WIP] Add databricks_function resource Nov 2, 2024
@ian-norris-ncino
Copy link

Hello, is there any timeline on when this could make it into the provider? Would love to have this soon!

@dgomez04
Copy link
Contributor Author

dgomez04 commented Nov 4, 2024

Hi @ian-norris-ncino. I'm aiming to have this integrated into the provider by the end of the month, depending on my availability. I'll keep you posted.

Copy link

github-actions bot commented Nov 7, 2024

If integration tests don't run automatically, an authorized user can run them manually by following the instructions below:

Trigger:
go/deco-tests-run/terraform

Inputs:

  • PR number: 4189
  • Commit SHA: f0b26224022f09addbe0dbc902911ad0e2501015

Checks will be approved automatically on success.

@dgomez04 dgomez04 changed the title [Feature] [WIP] Add databricks_function resource [Feature] Add databricks_function resource Nov 7, 2024
name = "calculate_bmi"
catalog_name = databricks_catalog.sandbox.name
schema_name = databricks_schema.functions.name
input_params = [
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It could be easier for people to specify input_param as separate blocks, like we do in other resources

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although doc says that input_params is a block, and then there are parameters inside: https://docs.databricks.com/api/workspace/functions/create#input_params

* `name` - (Required) The name of the parameter.
* `type` - (Required) The data type of the parameter (e.g., `DOUBLE`, `INT`, etc.).
* `data_type` - (Required) The return data type of the function (e.g., `DOUBLE`).
* `routine_body` - (Required) Specifies the body type of the function, either `SQL` for SQL-based functions or `EXTERNAL` for functions in external languages.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see return_params

@eng-dev-ecosystem-bot
Copy link
Collaborator

Test Details: go/deco-tests/11869831592

Comment on lines +32 to +52
func waitForFunction(ctx context.Context, w *databricks.WorkspaceClient, funcInfo *catalog.FunctionInfo) diag.Diagnostics {
const timeout = 5 * time.Minute

result, err := retries.Poll[catalog.FunctionInfo](ctx, timeout, func() (*catalog.FunctionInfo, *retries.Err) {
attempt, err := w.Functions.GetByName(ctx, funcInfo.FullName)
if err != nil {
if apierr.IsMissing(err) {
return nil, retries.Continue(fmt.Errorf("function %s is not yet available", funcInfo.FullName))
}
return nil, retries.Halt(fmt.Errorf("failed to get function: %s", err))
}
return attempt, nil
})

if err != nil {
return diag.Diagnostics{diag.NewErrorDiagnostic("failed to create function", err.Error())}
}

*funcInfo = *result
return nil
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need it for functions? I thought that function creation should be fast.

c.SetRequired("data_type")
c.SetRequired("routine_body")
c.SetRequired("routine_defintion")
c.SetRequired("language")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

full_data_type marked as required in API spec: https://docs.databricks.com/api/workspace/functions/create but I'm not sure if it's really required. We need to check with UC team

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

similarly for is_null_call and is_deterministic

Copy link
Contributor

@tanmay-db tanmay-db left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @dgomez04, thanks for the PR, left some comments.

}

func waitForFunction(ctx context.Context, w *databricks.WorkspaceClient, funcInfo *catalog.FunctionInfo) diag.Diagnostics {
const timeout = 5 * time.Minute
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the 5minute timeout expected for function? Just wanted to check if this should be bigger or smaller?


funcInfo, err := w.Functions.Create(ctx, createReq)
if err != nil {
resp.Diagnostics.AddError("failed to create function", err.Error())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should return after this

return
}

funcInfo, err := w.Functions.Update(ctx, updateReq)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is waiting only required during creation? or also during update?


funcInfo, err := w.Functions.Update(ctx, updateReq)
if err != nil {
resp.Diagnostics.AddError("failed to update function", err.Error())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here -- we should return after this

}

func TestFunctionResource(t *testing.T) {
acceptance.UnityWorkspaceLevel(t, acceptance.Step{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should add another step to test the update pathway.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[FEATURE] New feature request: Create function
5 participants